有 $n$个点$,m $个操作,每次连接两个点,或者询问某两个点最早是在什么时刻开始连通的
并查集按秩合并$+LCA$找最大。
并查集按秩合并:复杂度为$O(nlogn)$,稍劣于路径压缩,但优点在于保留了树形结构,对于每个并查集记录一个值$rank$,初始值为$1$,表示树高,每次将$rank$小的并查集根节点合并到$rank$大的并查集根节点上(即把$f[find(x)]$赋值成$find(y))$,并将$v[x]$赋为$cnt$(即当前是第几次合并)这时$rank$不变,若两个并查集$rank$相同,则将一个合并到另一个,将$v[x]$赋值$,rank[find(y)]++;$
在$find$函数中,每次在回溯过程中更新每个点的一个值$deep$,表示它的深度$(deep[k]=deep[f[k]]+1;)$
若$opt=0$,每次用并查集按秩合并两个点.
若$opt=1$,则用暴力求$LCA$的方法从一个点不停的走向它的父亲,直到它的$deep\geqslant$另一个点的$deep$,此时若$deep[x]==deep[y]$,则退出,否则交换$x$与$y$,继续进行上述过程,直到$x==y$,在过程中不断更新$v[x]$的最大值,记录在变量$ans$中,并返回$ans$。
1 |
|